Apache POI是一個基於Java的免費開源函式庫,相較於JasperReports只能匯出,Apache POI可以讓我們讀取、匯出Excel、Word、Power Point等Microsoft Office的各種文件。
由於我個人經驗是處理Excel而已,因此會以Excel的相關API與類別的介紹為主。
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
Office文件分為2003以及之前的版本與2007以及之後的版本,在2007以及之後的版本採用了Office Open XML (OOXML)的檔案格式,提升資料儲存與傳輸的效率,而依據要處理的Office文件的不同,Apache POI提供了許多相應的實現類別:
其他還有Outlook、Publisher等等。
JasperReports也有區分版本,例如匯出Excel有JRXlsExporter和JRXlsxExporter兩種,匯出時都要注意副檔名用錯的話會打不開。
Excel的處理由Workbook介面作為工作簿,常用HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook三種實現類別來處理Excel。
用於Excel 2003和以前的版本,格式為.xls,匯出的列數最多只有65535列,資料量少,以現今的電腦而言比較不會發生OOM (Out of Memory)。
Excel 2007和以後的版本,格式為.xlsx,匯出的列數最多1048576列,但因為使用XSSFWorkbook建立的物件是存在記憶體中的,如果一次要處理這麼多資料是有可能發生OOM。
SXSSFWorkbook就是為了 解決XSSFWorkbook大資料量的OOM情況 所誕生的,以流式處理(Streaming)的方式來逐步處理一部分資料,而不是一次性將所有資料載入記憶體中。我們可以自己設定記憶體當下要處理多少列數,將超過限制的列數由記憶體中的資料持久化暫存到硬碟,用這種逐步寫入的方式匯出大資料量的Excel,增加了大量資料寫入的效率,但不適合讀取、刪改文件,也無法做圖表,可以視為一種專門匯出大量資料的XSSFWorkbook。
他們的差異我大致整理為下表:
Workbook | HSSFWorkbook | XSSFWorkbook | SXSSFWorkbook |
---|---|---|---|
檔案格式 | .xls | .xlsx | .xlsx |
最大列數 | 約6.5萬 | 約104萬 | 約104萬 |
處理大量資料效能 | - | 較低 | 較高 |
讀取 | O | O | X |
寫入(匯出) | O | O | O |
刪除工作簿、列、單元格 | O | O | X |
做圖表 | O | O | X |
後面的文章會實際使用XSSFWorkbook、SXSSFWorkbook匯出Excel,並實測一下大量資料的情況下,兩者匯出的效率到底差多少。